<?php

class MemcacheModel {

	private $mc = null;

	/**
	 * 构造方法,用于添加服务器并创建memcahced对象
	 */
	function __construct($servers=array()) {

		if (class_exists('Memcache')){
			$mc = new Memcache;
		}
		else {
			return false;
		}

		if (count($servers) > 1)
		{
			//如果有多个memcache服务器
			foreach ($servers as $v) {
				call_user_func_array(array($mc, 'addServer'), $v);
			}

		} else {
			//如果只有一个memcache服务器
			call_user_func_array(array($mc, 'addServer'), $servers[0]);
		}

		$this->mc = $mc;
	}

	/**
	 * 获取memcached对象
	 * @return	object		memcached对象
	 */
	function getMem() {
		return $this->mc;
	}

	/**
	 * 检查mem是否连接成功
	 * @return	bool	连接成功返回true,否则返回false
	 */
	function mem_connect_error() {
		$stats = $this->mc->getStats();
		if (empty($stats)) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 向memcache中添加数据
	 * @param	string	$key		memcache的key
	 * @param	mixed	$val		需要缓存的数据
	 * @param	integer	$cache_time	缓存有效时间
	 * @param	boolean	$isCommon	是否公用(区分分仓)
	 * @param	string	$warehouse	分仓(取公用缓存时设置有效)
	 * @return	void
	 */
	function addCache($key, $val, $cache_time=7200, $isCommon=false)
	{
		if (empty($this->mc)){
			return false;
		}

		$key = md5($key.SESS_ID);

		$cache_time = intval($cache_time) ? intval($cache_time) : 7200;
		$this->mc->set($key, $val, MEMCACHE_COMPRESSED, $cache_time);
	}

	/**
	 * 获取memcahce中保存的数据
	 * @param	string	$sql	使用SQL的key
	 * @param	boolean	$isCommon	是否公用(区分分仓)
	 * @param	string	$warehouse	分仓(取公用缓存时设置有效)
	 * @return 	mixed	返回缓存中的数据
	 */
	function getCache($key, $isCommon=false, $warehouse=NULL)
	{
		if (empty($this->mc)){
			return false;
		}


		// 后台设置不开启使用memcache时，删除所有前端memcache缓存
		if (!defined('WAP_ADMIN') && defined('OPEN_MEMCACHE') && OPEN_MEMCACHE != 1){
			$this->del($key, $isCommon);
			return false;
		}

		$key = md5($key.SESS_ID);

		return $this->mc->get($key);
	}

	/**
	 * 删除单独一个语句的缓存
	 * @param	string	$sql 执行的SQL语句
	 */
	function del($key, $isCommon=false)
	{
		if (empty($this->mc)){
			return false;
		}

		$key = $isCommon ? md5($key) : md5($key.SESS_ID);
		$this->mc->delete($key, 0); //0 表示立刻删除
	}

	/**
	 * 刷新缓存
	 */
	function flush(){
		if (empty($this->mc)){
			return false;
		}

		$this->mc->flush();
	}

	/**
	 * 运行状态
	 */
	function getStatus(){
		if (empty($this->mc)){
			return false;
		}

		return $this->mc->getStats();
	}

}